package com.young.mybatis.v2.sqlnode;

import com.young.mybatis.v2.sqlnode.iface.SqlNode;
import com.young.utils.*;

/**
 * 描述:封装${}的sql信息
 *
 * @author BluceYoung
 * @create 2020-07-04 9:37
 * B站：TeacherYoung凌风
 * www.teacheryoung.com
 */
public class TextSqlNode implements SqlNode {
    private String sqlText;

    public TextSqlNode(String sqlText) {
        this.sqlText = sqlText;
    }

    public void apply(DynamicContext context) {

        GenericTokenParser tokenParser=new GenericTokenParser("${","}",new BindingTokenHandler(context));
        String sql=tokenParser.parse(sqlText);
        context.appendSql(sql);
    }

    public boolean isDynamic() {
        return sqlText.indexOf("${") > -1;
    }

    class BindingTokenHandler implements TokenHandler{

        private DynamicContext context;
        public BindingTokenHandler(DynamicContext context){
            this.context=context;
        }

        /**
         * 将${}
         * @param content ${}的内容
         * @return
         */
        public String handleToken(String content) {
            //用参数替换${}
            Object parameter = context.getBindings().get("_parameter");
            if(parameter==null){
                return "";
            }else if(SimpleTypeRegistry.isSimpleType(parameter.getClass())){
                return parameter.toString();
            }
            Object value = OgnlUtils.getValue(content,parameter);

            return value==null?"":value.toString();
        }
    }
}
